/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package server;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;

/**
 *
 * @author Dieter Van der Stock
 */
public class Server {
    /* We maken hier een multiplexing server naar 
     * het principe van Java NIO (New Input/Output)
     * Dankzij dit systeem hebben we geen aparte threads meer nodig voor elke
     * operatie, maar kunnen we een selector gebruiken die al onze verbindingen
     * zal beheren. Zowel nieuwe verbindingen (serverSocketKanaal)
     * en bestaande (socketKanaal)
     * */
    
    private ServerSocketChannel serverSocketKanaal;
    private static Selector selector;     
    

    /**
     * Maakt een nieuwe instantie van een server aan.
     * 
     * @param poort Het poortnummer waarop we onze server laten draaien.
     */
    Server(int poort) {
        ServerSocket serverSocket;
        
        System.out.println("Trachten om onze server te laten luisteren op poort " + poort + " ...");
        try {
            
            //serverSocketKanaal en serverSocket aanmaken en configureren
            serverSocketKanaal = ServerSocketChannel.open();
            serverSocketKanaal.configureBlocking(false); //moet VOOR de creatie van de socket gebeuren
            serverSocket = serverSocketKanaal.socket();
            
            //serverSocket binden aan een poort
            InetSocketAddress adres = new InetSocketAddress(poort);
            serverSocket.bind(adres);
            
            //ons selector-object creeëren om onze verbindingen in het oog te houden
            selector = Selector.open();
            
            //ons serverSocketKanaal registreren bij de selector voor het ontvangen van binnenkomende connecties
            serverSocketKanaal.register(selector, SelectionKey.OP_ACCEPT);           
            
        }
        catch(IOException ioEX) {
            System.out.println("gefaald.");
            ioEX.printStackTrace(); 
        }
        System.out.println("Gelukt.");
        
        System.out.println("De server gaat nu in luistermode. Als er inkomende connecties zijn zal hij die afhandelen.");
        verwerkAanvragen();
    }
}
